package br.com.foxinline.manager.criar;

import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Cidade;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Estado;
import br.com.foxinline.modelo.Prefeitura;
import br.com.foxinline.servico.AnexoServico;
import br.com.foxinline.servico.DadosIptuServico;
import br.com.foxinline.servico.EnderecoServico;
import br.com.foxinline.servico.ParcelaServico;
import br.com.foxinline.servico.PrefeituraServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.util.ArquivoUtilitario;
import br.com.foxinline.util.Msg;
import br.com.foxinline.util.ProcessarArquivoRetorno;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

/**
 *
 * @author laverson
 */
@ManagedBean
@ViewScoped
public class ManagerPrefeitura extends ManagerPesquisarGenerico<Prefeitura> {

    @EJB
    PrefeituraServico prefeituraServico;
    @EJB
    EnderecoServico enderecoService;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    AnexoServico anexoServico;
    @EJB
    ParcelaServico parcelaServico;
    @EJB
    DadosIptuServico dadosIptuServico;
    private ArquivoUtilitario arquivoUtilitario;
    private Prefeitura prefeitura;
    private Anexo anexoRemover;
    private Anexo anexoLogoRemover;

    @Override
    public void init() {

        setServico(prefeituraServico);

        arquivoUtilitario = new ArquivoUtilitario();

        this.anexoRemover = null;
        this.anexoLogoRemover = null;

        iniciarPrefeitura();
    }

    public void iniciarPrefeitura() {

        this.prefeitura = prefeituraServico.find();

        if (this.prefeitura.getEndereco() == null) {
            this.prefeitura.setEndereco(new Endereco());
        }

        if (this.prefeitura.getLogo() != null && this.prefeitura.getLogo().getId() != null) {
            this.prefeitura.setLogo(anexoServico.find(this.prefeitura.getLogo().getId()));
        } else {
            this.prefeitura.setLogo(anexoServico.getAnexoPadrao());
        }

        if (this.prefeitura.getLogoRegularizacaoFundiaria() != null && this.prefeitura.getLogoRegularizacaoFundiaria().getId() != null) {
            this.prefeitura.setLogoRegularizacaoFundiaria(anexoServico.find(this.prefeitura.getLogoRegularizacaoFundiaria().getId()));
        } else {
            this.prefeitura.setLogoRegularizacaoFundiaria(anexoServico.getAnexoPadrao());
        }

    }

    public void salvar() {
        try {

            if (this.prefeitura.getLogo().equals(anexoServico.getAnexoPadrao())) {
                this.prefeitura.setLogo(null);
            }

            if (this.prefeitura.getLogoRegularizacaoFundiaria().equals(anexoServico.getAnexoPadrao())) {
                this.prefeitura.setLogoRegularizacaoFundiaria(null);
            }

            excluirAnexo();
            excluirLogoRegularizacaoFundiaria();

            if (this.prefeitura.getId() == null) {

                prefeituraServico.save(this.prefeitura);

            } else {

                prefeituraServico.update(this.prefeitura);
            }

            init();

            Msg.messagemInfo(Msg.SuccessFull);

        } catch (Exception e) {

            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void limpar() {
        this.prefeitura = new Prefeitura();
        this.prefeitura.setEndereco(new Endereco());
    }

    public void existeEndereco() {
        String cep = this.prefeitura.getEndereco().getCep();
        String numero = this.prefeitura.getEndereco().getNumero();
        String complemento = this.prefeitura.getEndereco().getCompl();

        Endereco endereco = this.enderecoService.existCep(this.prefeitura.getEndereco());

        if (endereco != null) {
            this.prefeitura.setEndereco(endereco);
            RequestContext.getCurrentInstance().update("form:enderecoPanel");
        }

        this.prefeitura.getEndereco().setCep(cep);
        this.prefeitura.getEndereco().setNumero(numero);
        this.prefeitura.getEndereco().setCompl(complemento);
    }

    public void adicionarBrasao(FileUploadEvent event) throws IOException {
        try {
            Anexo anexo = arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());

            this.prefeitura.setLogo(anexo);

        } catch (FileNotFoundException e) {

            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);

        } catch (SQLException e) {

            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /**
     * Remove o anexo da lista de anexos que está sendo adicionado e remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerBrasao() {

        try {
            this.anexoRemover = this.prefeitura.getLogo();

            this.prefeitura.setLogo(this.anexoServico.getAnexoPadrao());

        } catch (Exception e) {

            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public boolean habilitaRemoverBrasao() {
        return !this.prefeitura.getLogo().equals(this.anexoServico.getAnexoPadrao());
    }

    public boolean habilitaRemoverLogo() {
        return !this.prefeitura.getLogoRegularizacaoFundiaria().equals(this.anexoServico.getAnexoPadrao());
    }

    public void adicionarLogoRegularizacaoFundiaria(FileUploadEvent event) throws IOException {
        try {
            Anexo anexo = arquivoUtilitario.adicionarArquivo(event.getFile().getContents(), event.getFile().getFileName(), event.getFile().getContentType());

            this.prefeitura.setLogoRegularizacaoFundiaria(anexo);

        } catch (FileNotFoundException e) {

            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);

        } catch (SQLException e) {

            System.err.println(e);
            Logger.getLogger(ManagerCriarImovel.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /**
     * Remove o anexo da lista de anexos que está sendo adicionado e remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerLogoRegularizacaoFundiaria() {

        try {
            this.anexoLogoRemover = this.prefeitura.getLogoRegularizacaoFundiaria();

            this.prefeitura.setLogoRegularizacaoFundiaria(this.anexoServico.getAnexoPadrao());

        } catch (Exception e) {

            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    @Override
    public void remover() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Exclui o anexo servidor, de acordo com sua URL + Nome, e do banco caso tenha sido gravado
     */
    private void excluirAnexo() {

        if (this.anexoRemover != null) {
            try {
                arquivoUtilitario.excluirArquivo(new File(this.anexoRemover.getUrl() + this.anexoRemover.getNome()));
                anexoServico.delete(this.anexoRemover);

            } catch (FileNotFoundException e) {

                System.err.println(e);
                Msg.messagemError(Msg.Failure);
            }
        }
    }

    /**
     * Exclui o anexo servidor, de acordo com sua URL + Nome, e do banco caso tenha sido gravado
     */
    private void excluirLogoRegularizacaoFundiaria() {

        if (this.anexoLogoRemover != null) {
            try {
                arquivoUtilitario.excluirArquivo(new File(this.anexoLogoRemover.getUrl() + this.anexoLogoRemover.getNome()));
                anexoServico.delete(this.anexoLogoRemover);

            } catch (FileNotFoundException e) {

                System.err.println(e);
                Msg.messagemError(Msg.Failure);
            }
        }
    }

    public void adicionarArquivoRetorno(FileUploadEvent event) throws IOException {

        try {
            UploadedFile file = event.getFile();

            ProcessarArquivoRetorno arquivoRetorno = new ProcessarArquivoRetorno(file.getInputstream(), file.getFileName(), parcelaServico, this.dadosIptuServico);

            arquivoRetorno.processarArquivo();

            Msg.messagemInfo(Msg.SuccessFull);

        } catch (Exception e) {

            System.err.println(e);
            Msg.messagemError(Msg.Failure);
        }
    }

    public void adicionarContaBancaria() {
    }

    public void limparContaBancaria() {
    }

    public void limparCidade(Estado estado) {
        this.prefeitura.getEndereco().setBairroDne(new Bairro());
        this.prefeitura.getEndereco().getBairroDne().setCidade(new Cidade());
        this.prefeitura.getEndereco().getBairroDne().getCidade().setEstado(estado);
    }

    public void limparBairro(Cidade cidade) {
        this.prefeitura.getEndereco().setBairroDne(new Bairro());

        if (cidade != null && cidade.getEstado() != null) {
            this.prefeitura.getEndereco().getBairroDne().setCidade(cidade);
            this.prefeitura.getEndereco().getBairroDne().getCidade().setEstado(cidade.getEstado());
        }
    }

    public Prefeitura getPrefeitura() {
        return this.prefeitura;
    }

    public void setPrefeitura(Prefeitura proprietario) {
        this.prefeitura = proprietario;
    }
}
